查看原文
其他

精通Linux系列二十八:标准输出、格式化输出

拾叁 更AI 2023-10-21

点击关注公众号,AI&编程干货及时送达   


屏幕输出

命令含义
echo在标准输出上打印简单文本。
printf在标准输出上打印格式化的文本。
yes在标准输出上打印重复的文本。
seq在标准输出上打印数字序列。
clear清除屏幕或窗口。

Linux提供了几个用于在标准输出上打印消息的命令,例如echo

→ echo hello world
hello world

每个命令都有不同的优点和预期用途。学习Linux、调试问题、编写shell脚本(参见[“用Shell脚本编程”])或仅仅是自言自语时,这些命令都是非常有价值的。

echo

stdin  stdout  - file  -- opt  --help  --version

echo [options] strings

echo命令简单地打印其参数:

→ echo 我们正在玩
我们正在玩

令人困惑的是,有几个不同的echo命令,其行为略有不同。有一个*/bin/echo*,但Linux shell通常使用一个内置命令覆盖它,该命令称为echo。要找出您正在使用哪个,请运行以下命令:

→ type echo
echo是一个shell内置命令

有用的选项

-n不打印最后的换行符。
-e识别并解释转义字符。例如,尝试echo 'hello\a'echo -e 'hello\a'。前者直接打印,后者会发出哔哔声。
-E不解释转义字符:-e的反义词。

可用的转义字符有:

\a警报(播放哔哔声)
\b退格
\c不打印最后的换行符(与-n效果相同)
\f换页
\n换行
\r回车
\t横向制表符
\v纵向制表符
\\一个反斜杠
\'单引号
\"双引号
\nnnASCII值为*nnn*的字符(八进制)

printf

stdin  stdout  - file  -- opt  --help  --version

printf format_string [arguments]

printf命令是增强版的echo:它在标准输出上打印格式化的字符串。它的操作方式与C编程语言的printf()函数非常相似,该函数将格式字符串应用于一系列参数以创建某些指定的输出。例如:

→ printf "用户%s今年%d岁。\n" sandy 29
用户sandy今年29岁。

第一个参数是格式字符串,在我们的例子中包含两个格式说明符,%s%d。后续的参数,sandy和29,被printf替换到格式字符串中然后打印。格式说明符可以用于浮点数,变得很精细:

→ printf "那将是$%0.2f, 先生。\n" 3
那将是$3.00, 先生。

Linux中有两个printf命令可用:一个内置在bash shell中,另一个在*/usr/bin/printf*中。两者之间的区别只在于一个格式说明符,%q,仅由bash内置支持:它打印转义符号(“\”),因此其输出可以安全地用作shell输入。注意区别:

→ printf "这是一个引号:%s\n" "\""
这是一个引号:"
→ printf "这是一个引号:%q\n" "\""
这是一个引号:\"

Note: The original content contained terms and references specific to UNIX and Linux, which are retained in the translated content.

确保格式说明符(%)的数量等于提供给printf的参数数量是你的责任。如果参数过多,多余的将被忽略;如果参数过少,printf会假设默认值(数值格式为0,字符串格式为空字符串)。尽管如此,你应该把这种不匹配视为错误,即使printf能够宽容处理。如果这些在你的shell脚本中隐藏,那么它们就是潜在的错误。格式说明符在C函数printf的手册页(manpage)中有详细描述(参见man 3 printf)。以下是一些常用的:

%d十进制整数
%ld长十进制整数
%o八进制整数
%x十六进制整数
%f浮点数
%lf双精度浮点数
%c单个字符
%s字符串
%q转义任何shell元字符的字符串
%%单独的百分号

在前导百分号后,你可以插入一个数字表达式来表示输出的最小宽度。例如,“%5d”意味着以五字符宽的字段打印十进制数,而“%6.2f”表示以六字符宽的字段打印浮点数,并在小数点后有两位数字。一些有用的数字表达式是:

n最小宽度*n*。
0n最小宽度*n*,用前导零填充。
n.m最小宽度*n,小数点后有m*位数字。

printf还可以解释如“\n”(打印换行符)和“\a”(响铃)这样的转义字符。查看echo命令以获取完整列表。

yes

stdin  stdout  - 文件  -- 选项  --help  --version

yes [字符串]

yes命令将给定的字符串(默认为“y”)无限次地打印,每行一个字符串:

虽然一开始它可能看起来没什么用,但yes可以完美地将交互式命令转换为批处理命令。想要摆脱烦人的“你确定要这么做吗?”消息?将yes的输出导入命令的输入以回答所有这些提示:

→ yes | 我的交互式命令

当*我的交互式命令*终止时,yes也会终止。

seq

stdin  stdout  - 文件  -- 选项  --help  --version

seq [选项] 规格

seq命令打印一系列整数或实数,适合传输给其他程序。有三种类型的规格参数:

  • • 一个数字:上限seq从1开始,数到这个数字:→ **seq 3** 1 2 3

  • • 两个数字:下限和上限seq从第一个数字开始,尽可能数到第二个数字:→ **seq 2 5** 2 3 4 5

  • • 三个数字:下限、增量和上限seq从第一个数字开始,按第二个数字增加,到达(或之前到达)第三个数字:→ **seq 1 .3 2** 1 1.3 1.6 1.9你还可以使用负增量倒退:→ **seq 5 -1 2** 5 4 3 2

有用的选项

-w根据需要打印前导零,使所有行宽度相同:→ **seq -w 8 10** 08 09 10
-f 格式使用类似printf的格式字符串格式化输出行,必须包括%g(默认)、%e%f→ **seq -f '*%g*' 3** **1** **2** **3**
-s 字符串使用给定的字符串作为数字之间的分隔符。默认情况下,会打印一个换行符(即,每行一个数字):→ **seq -s ':' 10** 1:2:3:4:5:6:7:8:9:10

clear

stdin  stdout  - 文件  -- 选项  --帮助  --版本

clear

这个命令简单地清除了你的显示屏或者命令行窗口。

推荐阅读

··································

你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存